﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ElkiTools.SQLite.EntityModels;

namespace ElkiTools.SQLite.DAL
{
    public static class AppParametersRepository
    {
        private static log4net.ILog logger = log4net.LogManager.GetLogger(typeof(AppParametersRepository));

        /// <summary>
        /// Récupération de l'ensemble des paramètres
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<AppParameter> GetAllAppParameters()
        {
            IEnumerable<AppParameter> result = null;
            //--------------------------------------------------------------------------------------------------

            try
            {
                using (AppParametersModelContext context = new AppParametersModelContext())
                {
                    result = context.AppParameters.ToList();
                }
            }
            catch (Exception exc)
            {
                if (logger.IsErrorEnabled)
                {
                    logger.Error(exc.Message, exc);
                }
            }

            //--------------------------------------------------------------------------------------------------
            return result;
        }

        /// <summary>
        /// Récupération d'un paramètre
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static AppParameter GetAppParameter(string key)
        {
            AppParameter result = null;
            //--------------------------------------------------------------------------------------------------

            if (!string.IsNullOrEmpty(key))
            {
                try
                {
                    using (AppParametersModelContext context = new AppParametersModelContext())
                    {
                        // Récupération de l'instance si elle existe
                        result = context.AppParameters
                            .Where(param => key.Equals(param.Key, StringComparison.InvariantCultureIgnoreCase))
                            .FirstOrDefault();
                    }
                }
                catch (Exception exc)
                {
                    if (logger.IsErrorEnabled)
                    {
                        logger.Error(exc.Message, exc);
                    }
                }
            }

            //--------------------------------------------------------------------------------------------------
            return result;
        }

        /// <summary>
        /// Définition d'un paramètre
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public static void SetAppParameters(string key, string value)
        {
            if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value))
            {
                try
                {
                    using (AppParametersModelContext context = new AppParametersModelContext())
                    {
                        // Récupération de l'instance si elle existe
                        AppParameter parameter = context.AppParameters
                            .Where(param => key.Equals(param.Key, StringComparison.InvariantCultureIgnoreCase))
                            .FirstOrDefault();

                        if (parameter == null)
                        {
                            parameter = new AppParameter()
                            {
                                Key = key
                            };
                            context.AppParameters.AddObject(parameter);
                        }

                        // Définition de la valeur
                        parameter.Value = value;

                        // Enregistrement des modifications
                        context.SaveChanges();
                    }
                }
                catch (Exception exc)
                {
                    if (logger.IsErrorEnabled)
                    {
                        logger.Error(exc.Message, exc);
                    }
                }
            }
        }
    }
}
